<?xml version='1.0' encoding='utf-8'?>
<html xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <title>Pro Git - 简体中文版
</title>
    <meta content="http://www.w3.org/1999/xhtml; charset=utf-8" http-equiv="Content-Type"/>
    <link href="stylesheet.css" type="text/css" rel="stylesheet"/>
    <style type="text/css">
		@page { margin-bottom: 5.000000pt; margin-top: 5.000000pt; }</style>
  </head>
  <body class="calibre">
<h2 id="calibre_toc_39" class="calibre3">Git 进程</h2>

<p class="calibre2">公共，非授权的只读访问要求我们在 HTTP 协议的基础上使用 Git 协议。主因在于速度。Git 协议更为高效，进而比 HTTP 协议更迅速，所以它能节省很多时间。</p>

<p class="calibre2">重申一下，这一点只适用于非授权、只读的访问。如果在防火墙之外的服务器上，该服务的使用应该局限于公诸于世的项目。假如是在防火墙之内，它也可以用于具有大量参与人员或者主机（长期整合资源或编译的服务器）的只读访问的项目，可以省去为逐一添加 SSH 公钥的麻烦。</p>

<p class="calibre2">无论哪种情况，Git 协议的设定都相对简单。基本上，只要以长期守护进程的形式运行该命令：</p>

<pre class="calibre8"><code class="calibre9">git daemon --reuseaddr --base-path=/opt/git/ /opt/git/
</code></pre>

<p class="calibre2"><code class="calibre9">--reuseaddr</code> 使得服务无须等到旧的连接尝试过期以后再重启，<code class="calibre9">--base-path</code> 选项使得克隆项目的时候不用给出完整的路径，而最后面的路径告诉 Git 进程导出仓库的位置。假如有防火墙，则需要为该主机的 9418 端口打个允许通信的洞。</p>

<p class="calibre2">有几个不同的办法可以让该进程长期驻留，取决于不同的操作系统。在 Ubuntu 主机上，可以用 Upstart 脚本来完成。于是，在下面这个文件</p>

<pre class="calibre8"><code class="calibre9">/etc/event.d/local-git-daemon
</code></pre>

<p class="calibre2">加入该脚本内容：</p>

<pre class="calibre8"><code class="calibre9">start on startup
stop on shutdown
exec /usr/bin/git daemon \
    --user=git --group=git \
    --reuseaddr \
    --base-path=/opt/git/ \
    /opt/git/
respawn
</code></pre>

<p class="calibre2">出于安全考虑，强烈建议用一个对仓库只有读取权限的用户身份来运行该进程——只需要简单的新创建一个 <code class="calibre9">git-ro</code> 用户（译注：并将它对仓库的权限设为只读），用它来运行进程。为了简化，下面我们将依旧使用运行了 Gitosis 的 'git' 用户。</p>

<p class="calibre2">重启主机的时候，Git 进程会自行启动，一旦关闭了也会自行重启。要不重启就开启它，可以运行这个命令：</p>

<pre class="calibre8"><code class="calibre9">initctl start local-git-daemon
</code></pre>

<p class="calibre2">在其他系统上，或许应该使用 <code class="calibre9">xinetd</code>，<code class="calibre9">sysinit</code> 的一个脚本，或者其他的——只要能让那个命令进程化和可监控。</p>

<p class="calibre2">然后，必须告诉 Gitosis 服务那些仓库允许基于 Git 协议的非授权访问。如果为每一个仓库设立了自己的节段，就可以指定想让 Git 进程给予可读权限的仓库。假如要允许通过 Git 协议访问前面的 iphone 项目，可以把如下内容加到 <code class="calibre9">gitosis.conf</code> 文件的结尾：</p>

<pre class="calibre8"><code class="calibre9">[repo iphone_project]
daemon = yes
</code></pre>

<p class="calibre2">在提交和推送完成以后，运行中的进程将开始相应所有能访问主机 9418 端口的人发来的项目请求。</p>

<p class="calibre2">假如不想使用 Gitosis，而又想架设一个 Git 协议进程，则必须为每一个想使用 Git 进程的项目运行如下命令：</p>

<pre class="calibre8"><code class="calibre9">$ cd /path/to/project.git
$ touch git-daemon-export-ok
</code></pre>

<p class="calibre2">该文件（译注：指空文件 git-deamon-export-ok）告诉 Git 允许对该项目的非授权访问。</p>

<p class="calibre2">Gitosis 还能控制 GitWeb 显示哪些项目。首先，在 <code class="calibre9">/etc/gitweb.conf</code> 添加如下内容：</p>

<pre class="calibre8"><code class="calibre9">$projects_list = "/home/git/gitosis/projects.list";
$projectroot = "/home/git/repositories";
$export_ok = "git-daemon-export-ok";
@git_base_url_list = ('git://gitserver');
</code></pre>

<p class="calibre2">通过在 Gitosis 的设置文件里添加或删除 <code class="calibre9">gitweb</code> 设定，就能控制 GitWeb 允许用户浏览哪些项目。比如，我们想让 iphone 项目在 GitWeb 里出现，把 <code class="calibre9">repo</code> 的设定改成下面的样子：</p>

<pre class="calibre8"><code class="calibre9">[repo iphone_project]
daemon = yes
gitweb = yes
</code></pre>

<p class="calibre2">如果现在提交和推送该项目，GitWeb 会自动开始展示我们的 iphone 项目。</p>

</body>
</html>
